#include "sphere.h"
#include <cmath>
#include <glm/glm.hpp>
#include <iostream>
#include <vector>
using namespace std;
Sphere::Sphere() { init(48); }
Sphere::Sphere(int prec) { // prec 表示精度，体现为切片的数量
  init(prec);
}
float Sphere::toRadians(float degrees) {
  return (degrees * 2.0f * 3.14159f) / 360.0f;
}
void Sphere::init(int prec) {
  numVertices = (prec + 1) * (prec + 1);
  numIndices = prec * prec * 6;
  // std::vector::push_back() 在向量的末尾增加一个新元素，并将向量长度加 1
  for (int i = 0; i < numVertices; i++) {
    vertices.push_back(glm::vec3());
  }
  for (int i = 0; i < numVertices; i++) {
    texCoords.push_back(glm::vec2());
  }
  for (int i = 0; i < numVertices; i++) {
    normals.push_back(glm::vec3());
  }
  for (int i = 0; i < numIndices; i++) {
    indices.push_back(0);
  }
  // 计算三角形顶点
  for (int i = 0; i <= prec; i++) {
    for (int j = 0; j <= prec; j++) {
      float y = (float)cos(toRadians(180.0f - i * 180.0f / prec));
      float x =
          -(float)cos(toRadians(j * 360.0f / prec)) * (float)abs(cos(asin(y)));
      float z =
          (float)sin(toRadians(j * 360.0f / prec)) * (float)abs(cos(asin(y)));
      vertices[i * (prec + 1) + j] = glm::vec3(x, y, z);
      texCoords[i * (prec + 1) + j] =
          glm::vec2(((float)j / prec), ((float)i / prec));
      normals[i * (prec + 1) + j] = glm::vec3(x, y, z);
    }
  }
  // 计算三角形索引
  for (int i = 0; i < prec; i++) {
    for (int j = 0; j < prec; j++) {
      indices[6 * (i * prec + j) + 0] = i * (prec + 1) + j;
      indices[6 * (i * prec + j) + 1] = i * (prec + 1) + j + 1;
      indices[6 * (i * prec + j) + 2] = (i + 1) * (prec + 1) + j;
      indices[6 * (i * prec + j) + 3] = i * (prec + 1) + j + 1;
      indices[6 * (i * prec + j) + 4] = (i + 1) * (prec + 1) + j + 1;
      indices[6 * (i * prec + j) + 5] = (i + 1) * (prec + 1) + j;
    }
  }
}